//
// Created by LiuYou on 2021/5/13.
//

/*
 * 操作:
 *      begin() 注意: 和vector返回的iterator不同, vector返回的是random-access-iterator, 而list返回的是bidirectional-iterator。
 *              所以, 能够进行的操作就有限制了, list返回的迭代器不能进行算术运算如: cbegin() + 2 , cbegin() + n 等, 但是可以 ++cbegin()或者--cbegin()。
 *      end()
 *      cbegin() 注意: cbegin()返回的是指向的元素为const, 而不是iterator是const。
 *      ...
 *
 *      push_back()
 *      pop_back()
 *      push_front()
 *      pop_front()
 *
 *      insert()
 *      erase() 注意: erase一般为 pos 或者 [beg, end) 。并且与insert()相对应。
 *
 *      remove() 注意: 一般是 remove(val)
 *      remove_if()
 *
 *      resize()
 *
 *      clear()
 */
#include <list>
#include <iostream>
#include "Todo.hpp"

typedef std::list<Todo> ListTodo;
using ListTODO = std::list<Todo>;

int main() {
    std::list<Todo> todoThings;
    std::cout << "todoThings.size(): " << todoThings.size() << std::endl;
    std::cout << "todoThings.empty(): " << todoThings.empty() << std::endl;

    Todo todo1("1", "1");
    Todo todo2("2", "2");
    Todo todo3("3", "3");
    Todo todo4("4", "4");
    Todo todo5("5", "5");
    todoThings.push_back(todo1);
    todoThings.push_back(todo2);
    todoThings.push_back(todo3);
    todoThings.push_back(todo4);
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;

    (*todoThings.begin()).setTodo("冲冲冲");
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;

//    const std::list<Todo>::iterator& iterator = todoThings.begin();
//    const std::list<Todo>::const_iterator& iterator = todoThings.cbegin();

    // TODO 注意: cbegin()返回的是指向的元素为const, 而不是iterator是const。
//    (*todoThings.cbegin()).setTodo("冲冲冲");

    todoThings.push_back(todo5);
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;
    todoThings.push_front(todo5);
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;

    todoThings.pop_back();
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;
    todoThings.pop_front();
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;

    // TODO 注意: vector的迭代器是可以进行算术运算的, 而list的迭代器只能进行 ++/-- 操作。
    todoThings.insert(++todoThings.cbegin(), todo5);
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;

//    const std::list<Todo>::iterator& iterator = todoThings.erase(todoThings.cbegin());

    std::cout << *todoThings.erase(todoThings.cbegin()) << std::endl << std::endl;
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;

    // 下面这两句是等效的。
    // TODO 注意: 要注意, 使用remove, 如果list中的元素是用户自定义的类型, 一定要写相等运算符函数才能调用remove()函数。
//    todoThings.remove(Todo("3", "3"));
    todoThings.remove(todo3);
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;

    std::cout << "todoThings.size(): " << todoThings.size() << std::endl;
    todoThings.resize(100);
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << "todoThings.size(): " << todoThings.size() << std::endl;

    todoThings.clear();
    for (const auto& item : todoThings) {
        std::cout << item << std::endl;
    }
    std::cout << "todoThings.size(): " << todoThings.size() << std::endl;


    return 0;
}